"""
Case Type   : cm_ctl
Case Name   : 执行cm_ctl pause后,执行cm_ctl stop后执行start
Create At   : 2023/03/24
Owner       : opentestcase012
Description :
    1.执行cm_ctl pause;
    2.停止集群;
    3.查看集群状态;
    4.启动集群;
    5.查看集群状态;
    6.在各节点指定主备机;
    7.查看集群状态;
    8.恢复集群状态;
Expect      :
    1.暂停成功
    2.执行成功
    3.集群停止,不显示集群状态Cluster State
    4.启动超时失败
    5.集群状态异常,dn为pending状态
    6.指定成功
    7.集群状态正常
    8.恢复成功
History     :
"""
import os
import time
import unittest

from testcase.utils.CommonSH import CommonSH
from testcase.utils.Constant import Constant
from testcase.utils.Logger import Logger

primary_sh = CommonSH('PrimaryDbUser')


# @unittest.skipIf(2 != primary_sh.get_node_num(), '非1+2环境不执行')
class DefinedResource(unittest.TestCase):
    def setUp(self):
        self.log = Logger()
        self.log.info(f'----{os.path.basename(__file__)} start----')
        self.constant = Constant()
        self.primary_sh = CommonSH('PrimaryDbUser')
        self.sta1_sh = CommonSH('Standby1DbUser')
        self.sta2_sh = CommonSH('Standby2DbUser')

    def test_cm(self):
        text = '----step1:执行cm_ctl pause; expect:暂停成功----'
        self.log.info(text)
        cm_ctl_res = self.primary_sh.exec_cm_ctl('pause')
        self.assertIn(self.constant.cm_pause_success_msg, cm_ctl_res,
                      '执行失败:' + text)

        text = '----step2:停止集群; expect:执行成功----'
        self.log.info(text)
        cm_ctl_res = self.primary_sh.exec_cm_ctl('stop')
        self.assertIn(self.constant.cm_stop_success_msg, cm_ctl_res,
                      '执行失败:' + text)

        time.sleep(10)
        text = '----step3:查看集群状态; expect:集群停止,不显示集群状态Cluster State----'
        self.log.info(text)
        cm_ctl_res = self.primary_sh.exec_cm_ctl('query', '-Civ')
        self.assertNotIn('Cluster State', cm_ctl_res, '执行失败:' + text)

        text = '----step4:启动集群; expect:启动超时失败----'
        self.log.info(text)
        cm_ctl_res = self.primary_sh.exec_cm_ctl('start')
        self.assertIn('cm_ctl: start cluster failed in (601)s', cm_ctl_res,
                      '执行失败:' + text)

        time.sleep(10)
        text = '----step5:查看集群状态; expect:集群状态异常,dn为pending状态----'
        self.log.info(text)
        cm_ctl_res = self.primary_sh.exec_cm_ctl('query', '-Civ')
        self.assertEqual(3, cm_ctl_res.count('Pending'), '执行失败:' + text)

        text = '----step6:在各节点指定主备机; expect:指定成功----'
        self.log.info(text)
        gs_ctl_res = self.primary_sh.execute_gsctl(
            'notify', self.constant.notify_success_msg, param='-M primary')
        self.assertTrue(gs_ctl_res, '执行失败:' + text)
        gs_ctl_res = self.sta1_sh.execute_gsctl(
            'notify', self.constant.notify_success_msg, param='-M standby')
        self.assertTrue(gs_ctl_res, '执行失败:' + text)
        gs_ctl_res = self.sta2_sh.execute_gsctl(
            'notify', self.constant.notify_success_msg, param='-M standby')
        self.assertTrue(gs_ctl_res, '执行失败:' + text)

        time.sleep(10)
        text = '----step7:查看集群状态; expect:集群状态正常----'
        self.log.info(text)
        cm_ctl_res = self.primary_sh.exec_cm_ctl('query', '-Civ')
        self.assertIn(self.constant.CLUSTER_NORMAL_MSG, cm_ctl_res,
                      '执行失败:' + text)

    def tearDown(self):
        self.log.info('-----清理环境-----')
        text = '----step8:恢复集群状态; expect:执行成功----'
        self.log.info(text)
        cm_ctl_res1 = self.primary_sh.exec_cm_ctl('resume')
        cm_ctl_res2 = self.primary_sh.exec_cm_ctl('start')
        time.sleep(10)
        cm_ctl_res3 = self.primary_sh.exec_cm_ctl('query', '-Civ')
        self.assertIn(self.constant.cm_resume_success_msg, cm_ctl_res1,
                      '执行失败:' + text)
        self.assertIn(self.constant.cm_start_success_msg, cm_ctl_res2,
                      '执行失败:' + text)
        self.assertIn(self.constant.CLUSTER_NORMAL_MSG, cm_ctl_res3,
                      "执行失败:" + text)
        self.log.info(f'----{os.path.basename(__file__)} finish----')
